Code profilers may include sampling profilers and instrumented profilers. Sampling profilers work by examining the state of a running program at regular time intervals (e.g., sampling at time intervals based on a number of clock cycles or page faults) to determine which function is executing. The advantages of sampling profilers include their ability to be used on any existing program (e.g., no special build is needed to use the profiler) and their ability to introduce minimal disruption to the running program. However, because the sampled data is taken at regular time intervals, a sampling profiler may not be able to provide a complete or precise view of the performance characteristics of the running program. Instrumented profilers require a program to be built in a special way in order to be profiled. Programs that can be examined with an instrumented profiler are built (or post-processed) with options that insert instrumentation hooks (or probes) into the binary at function entry and exit points. These hooks are then invoked when the program is running in order to collect profiling data. The advantage of an instrumented profiler is the large amount of profiling information that it can collect. For example, an instrumented profiler may collect complete call counts and map performance counters back to functions. However, in addition to requiring a special build in order to be used, instrumented profilers may distort a running program. For example, inserting the profiling hooks may change a compiler's ability to inline functions thereby changing runtime performance.